package websocket

import (
	"database/sql"
	"encoding/json"
	"fmt"
	"log"
	"tuiwen-go/internal/api"
	"tuiwen-go/internal/db"
	"tuiwen-go/internal/utils"
)

var promptData struct {
	ProjectID string `json:"project_id"`
	Id        string `json:"id"`
	Prompt    string `json:"data"`
}

// 提示词更新
func taskUpdatePromptHandler(c *Client, data json.RawMessage) {
	log.Printf("客户端 %s: 正在处理更新提示词任务, 数据: %s", c.ID, string(data))
	if err := json.Unmarshal(data, &promptData); err != nil {
		log.Printf("客户端 %s: 解析提示词任务数据失败: %v", c.ID, err)
		sendMessage(c, api.WxJSONResponse{Code: -1, Msg: "无效的提示词任务数据格式"})
		return
	}

	if len(promptData.ProjectID) == 0 || len(promptData.Id) == 0 {
		sendMessage(c, api.WxJSONResponse{Code: -1, Msg: "ID不能为空"})
		return
	}
	// 使用生成的提示词更新数据库
	sqlUpdate := "UPDATE text SET prompt = ? WHERE project_id = ? AND id = ?"
	_, err := db.Exec(sqlUpdate, promptData.Prompt, promptData.ProjectID, promptData.Id)
	if err != nil {
		log.Printf("客户端 %s: 更新文本 ID %s 的提示词失败: %d", c.ID, promptData.Id, err)
		// Continue processing other items, but log the error
	} else {
		sendMessage(c, api.WxJSONResponse{Code: 1, Msg: fmt.Sprintf("提示词更新成功 (ID: %s)", promptData.Id)})
	}
}

// 提示词任务处理程序
func taskTranslateHandler(c *Client, data json.RawMessage) {
	log.Printf("客户端 %s: 正在处理提示词任务, 数据: %s", c.ID, string(data))
	if err := json.Unmarshal(data, &promptData); err != nil {
		log.Printf("客户端 %s: 解析提示词任务数据失败: %v", c.ID, err)
		sendMessage(c, api.WxJSONResponse{Code: -1, Msg: "无效的提示词任务数据格式"})
		return
	}

	if len(promptData.ProjectID) == 0 {
		sendMessage(c, api.WxJSONResponse{Code: -1, Msg: "项目ID不能为空"})
		return
	}

	// 获取需要生成提示词的文本条目
	sqlQuery := "SELECT id, split FROM text WHERE project_id = ? AND split IS NOT NULL"
	args := []interface{}{promptData.ProjectID}
	if promptData.Id != "" {
		sqlQuery += " AND id = ?"
		args = append(args, promptData.Id)
	} else {
		sqlQuery += " AND (prompt IS NULL OR prompt = '')"
	}
	rows, err := db.Query(sqlQuery, args...)
	if err != nil {
		log.Printf("客户端 %s: 查询提示词任务文本失败: %v", c.ID, err)
		sendMessage(c, api.WxJSONResponse{Code: -1, Msg: "查询待生成提示词文本失败"})
		return
	}
	defer rows.Close()

	var textsToTranslate []struct {
		ID    int
		Split string
	}

	for rows.Next() {
		var id int
		var splitJSON sql.NullString
		err := rows.Scan(&id, &splitJSON)
		if err != nil {
			log.Printf("客户端 %s: 扫描提示词任务文本行失败: %v", c.ID, err)
			continue
		}

		textsToTranslate = append(textsToTranslate, struct {
			ID    int
			Split string
		}{ID: id, Split: splitJSON.String})
	}

	if err = rows.Err(); err != nil {
		log.Printf("客户端 %s: 遍历提示词任务文本行失败: %v", c.ID, err)
		sendMessage(c, api.WxJSONResponse{Code: -1, Msg: "处理待生成提示词文本失败"})
		return
	}

	if len(textsToTranslate) == 0 {
		sendMessage(c, api.WxJSONResponse{Code: 0, Msg: "提示词已全部生成"})
		return // No texts to translate
	}

	// 处理每个文本条目以生成提示词
	for _, item := range textsToTranslate {
		// 使用 GPT API 生成提示词
		generatedPrompt, err := utils.CallGPTAPI("prompt", item.Split)
		if err != nil {
			log.Printf("客户端 %s: 调用 GPT API 生成提示词失败 (ID: %d): %v", c.ID, item.ID, err)
			sendMessage(c, api.WxJSONResponse{Code: -1, Msg: fmt.Sprintf("提示词生成失败 (ID: %d): %v", item.ID, err)})
			continue // 继续处理下一个文本
		}

		// Update the database with the generated prompt
		// 使用生成的提示词更新数据库
		sqlUpdate := "UPDATE text SET prompt = ? WHERE project_id = ? AND id = ?"
		_, err = db.Exec(sqlUpdate, generatedPrompt, promptData.ProjectID, item.ID)
		if err != nil {
			log.Printf("客户端 %s: 更新文本 ID %d 的提示词失败: %v", c.ID, item.ID, err)
			// Continue processing other items, but log the error
		} else {
			sendMessage(c, api.WxJSONResponse{Code: 1, Msg: fmt.Sprintf("提示词生成成功 (ID: %d)", item.ID), Data: map[string]interface{}{
				"id":          item.ID,
				"prompt_data": generatedPrompt,
			}})
		}
	}
}
